package com.efrei.schoolmanager.model.hibernate.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.efrei.schoolmanager.exceptions.LogicException;
import com.efrei.schoolmanager.model.dao.HibernateDAO;
import com.efrei.schoolmanager.model.obj.Pays;
import com.efrei.schoolmanager.model.obj.Ville;

/**
 * DAO pour les villes avec hibernate
 */
public class VilleDAO extends HibernateDAO<Ville> {

	public VilleDAO(Session session) {
		super(session, Ville.class);
	}

	/**
	 * @return la liste des villes
	 */
	public List<Ville> getVilles() {
		return content("FROM Ville ORDER BY codePostal, nom");
	}

	/**
	 * cherche la ville en base (proxy) ou utilise create avec une nouvelle
	 * instance
	 * 
	 * @return la ville en base ou l'insertion
	 * @throws LogicException
	 */
	@SuppressWarnings("unchecked")
	public Ville getOrCreateVille(String codePostal, String nom, Pays pays)
			throws LogicException {
		codePostal = codePostal.trim();
		nom = nom.trim();
		// verifie les champs
		Ville.checkVille(codePostal, nom, pays);

		Session session = getSession();
		// recupere l'id
		String hql = "SELECT v.villeId FROM Ville v WHERE v.codePostal = :codePostal";
		Query getVille = session.createQuery(hql).setString("codePostal",
				codePostal);
		List<Integer> villeId = getVille.list();
		if(villeId.isEmpty()) {
			Ville ville = new Ville(codePostal, nom, pays);
			create(ville);
			return ville;
		}
		return (Ville) session.get(getType(), villeId.get(0));
	}
}
